<?php
/**
 * Api公共类
 * Interface引用api模式，没有display等view的渲染和页面模版输出
 */

namespace Common\Controller;

use Think\Controller\RestController;

class ApiController extends RestController
{

    protected $userId = null;

    public function _initialize()
    {
        switch ($this->_method) {
            case 'put':
                $token = I('put.token');
                $mobile = I('put.mobile');
                break;
            default:
                $token = I('request.token');
                $mobile = I('request.mobile');
                break;
        }

        if ($mobile) {
            $vToken = myDes_decode($token, $mobile);
            $arrStr = explode('|', $vToken);
            if ($mobile && $arrStr[0] === $mobile) {
                $this->userId = $arrStr[1];
            } else {
                $this->myApiPrint('user mobile error !');
            }
        } else
            $this->myApiPrint('user mobile error!');
    }

    public function index()
    {
        $this->myApiPrint('无效接口');
    }

    /**
     * 生成定长22位的订单码
     * @return string
     */
    public function MyOrderNo22()
    {
        $code = date('Ymd') . substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
        $code .= randCodeM(22 - strlen($code), 1);
        return $code;
    }

    /**
     * 检查请求有效性与参数
     * @param $time
     * @return bool
     */
    public function checkRequestTime($time)
    {
        if (($time) > 0) {
            //300秒/5分钟的有效请求
            $v = time() - $time;
            if ($v < 300 && $v > 0) return true;
            else return false;
        } else return false;
    }

    /**
     * 检查数组是否为空
     * @param $arr [数组array]
     * @return bool 返回布尔型值
     */
    public function arrIsEmpty($arr = array())
    {
        foreach ($arr as $v) {
            if (empty($v)) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 安全性接口，验签操作
     * @param $para_temp
     * @return bool|string
     */
    public function mySign($para_temp)
    {
        //除去待签名参数数组中的空值和签名参数
        $para_filter = $this->myParaFilter($para_temp);
        //对待签名参数数组排序
        $para_sort = $this->myArgSort($para_filter);
        //把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = $this->myParaLinkstring($para_sort);
        return $prestr;
    }

    /**
     * 安全性接口，验签操作
     * @param $para
     * @return array
     */
    public function myParaFilter($para)
    {
        $para_filter = array();
        while (list ($key, $val) = each($para)) {
            if ($key === "sign" || $key === "sign_pass" || $val === "") continue;
            else    $para_filter[$key] = $para[$key];
        }
        return $para_filter;
    }

    /**
     * 把数组所有元素，按照“参数=参数值”的模式用“&”字符拼接成字符串
     * @param $para [需要拼接的数组]
     * @return bool|string [拼接完成以后的字符串]
     */
    function myParaLinkstring($para)
    {
        $arg = "";
        while (list ($key, $val) = each($para)) {
            $arg .= $key . "=" . $val . "&";
        }
        //去掉最后一个&字符
        $arg = substr($arg, 0, count($arg) - 2);

        //如果存在转义字符，那么去掉转义
        if (get_magic_quotes_gpc()) {
            $arg = stripslashes($arg);
        }

        return $arg;
    }

    /**
     * 对数组排序
     * @param array $para 排序前的数组
     * @return array 排序后的数组
     */
    function myArgSort($para = array())
    {
        ksort($para);
        reset($para);
        return $para;
    }

    /**
     * 公共错误返回
     * @param string $msg 需要打印的错误信息
     * @param int $code 默认打印300信息
     * @param string $data 输出数据
     */
    public function myApiPrint($msg = '', $code = 400, $data = '')
    {
        if ($code == 200) {
            $result = array(
                'code' => $code,
                'msg' => $msg,
                'result' => $data
            );
        } else {
            $result = array(
                'code' => $code,
                'msg' => $msg,
                'result' => $data
            );
        }
        $this->ajaxReturn($result);
        exit;
    }
}